/**
 * 
 * @authors Your Name (you@example.org)
 * @date    2019-11-19 11:37:58
 * @version $Id$
 */

// 一、求平均数
	// 业务场景：该区域用户人均消费能力。
	const averageFn = (...numArr) => {
		return numArr.reduce((acc, val) => {
			return acc + val
		}, 0) / numArr.length
	}
	var average_val = averageFn(...[1, 2, 3, 4, 5])

	console.log(average_val)

	// 简写
	const averageFn2 = (...numArr) => (
		numArr.reduce (
			(acc, val) => acc + val, 0
		) / numArr.length
	)
	var average_val2 = averageFn2(...[1, 2, 3, 4, 5])

	console.log(average_val2)

	// 数组的值是一个对象的写法
	const averageFn3 = (objArr, key) => objArr.map(
		val => val[key]
	).reduce (
		(acc, val) => acc + val, 0
	) / objArr.length

	var average_val3 = averageFn3([
		{n: 1}, {n: 2}, {n: 3}, {n: 4}, {n: 5},
	], 'n')

	console.log(average_val3)

// 二、随机选择数组中一个
// 业务场景：多个广告商品，随机选择一个弹框。
const randomSelect = (arr) => arr[Math.floor(Math.random() * arr.length)];
const random_val = randomSelect([1,2,3])
console.log(random_val)

// 三、数组找相同
// 业务场景：两种商品对比
const common = (a, b) => {
	return a.filter(
		x => new Set(b).has(x)
	)
}

common([1,2,3], [2,3,4]) // [2,3]

// 四、数组找不同
// 业务场景：商品选择的时，之前已选的与当前选择的对比，保留相同的，去掉后者没有的，添加前者没有的。
const difference = (a, b) => {
	return a.filter(function(x) {
		return !new Set(b).has(x) ;
	});
}
var dif = difference([1,2,3], [2,3,4])
console.log('difdif', dif)

// 五、数组找索引
// 业务场景：查找满足条件的商品。
const indexIwant = (arr, val) => {
	return arr.reduce((prev, cur, index) => {
		return cur === val ? [...prev, index] : prev
	}, [])
}
var indexIwantVal = indexIwant([1,2,3,4,2,3,2], 2)
console.log('indexIwantVal', indexIwantVal)

// 六、改成标识钱的字符串
// 业务场景：价格显示易读形式。
function FormatMoney(money) {
	if (typeof money === 'number') money = money.toString();

	return money.replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,');
}
var money = FormatMoney(1314.11)
console.log('FormatMoney', money)

// 七、时分秒时间
// 业务场景：抢券时间显示在H5页面
const get24TimeFromDate = date => {
	console.log(date.toTimeString())
	return date.toTimeString().slice(0,8)
};
var time = get24TimeFromDate(new Date());
/*setInterval(function() {
	time = get24TimeFromDate(new Date());
	console.log('timetime', time)
}, 1000)
*/

// 八、起始值为0的顺序数组
// 业务场景：想用0到N这样的顺序元素。
const getIwantLenArr = l => {
	return Array.from(new Array(l).keys())
}
getIwantLenArr(5) // [0,1,2,3,4]

// 九、随机生成十六进制颜色
// 业务场景：运营在设置优惠券颜色时。

const randomColor = () => {
	const s = (Math.random() * 0xffff * 1000000).toString(16); // 16表示16进制
	console.log('randomColor', s)
	return '#' + s.slice(0,6)
}
randomColor()

// 十、执行时间
// 业务场景：性能优化时，最简单的检验方法。
const executionTime = callback => {
	console.time('executionTime')
	const r = callback()
	console.timeEnd('executionTime')
	return r;
}
executionTime(() => Math.sqrt(9));

// 十一、数组扁平化
// 业务场景：黑叔说前端。
const deepFlatten = (arr) => {
	return [].concat(...arr.map(v => {
		return Array.isArray(v) ? deepFlatten(v) : v
	}))
}
deepFlatten([1, [2,3], [4, [5,6]]])


// 十二、每N毫秒输出一个元素
// 业务场景：心声表达，表白大前端
const oneByOno = (sayWords, n) => {
	let i = 0;
	Object.keys(sayWords).forEach(key => {
		sayWords[key].forEach(value => {
			setTimeout(() => {
				console.log(value)
			}, n * i++)
		})
	})
}

/*oneByOno({
	first: ['我', '爱', '你'],
	second: ['前', '端']
}, 1000)*/

// 日历
// 创建过去七天的数组，如果将代码中的减号换成加号，你将得到未来7天的数组集合
const getPastWeeks = () => {
	return [...Array(7).keys()].map(days => new Date(Date.now() - 3600 * 24 * 1000 * days))
}
console.log(111, getPastWeeks())

// 获取URL的查询参数
const getUrlParams = (url) => {
	let options = {};
	// location.search.replace(/([^?&=]+)=([^&]+)/g,(_,k,v) => q[k] = v);
	url.replace(/([^?&=]+)=([^&]+)/g,(_,k,v) => options[k] = v);
	console.log('getUrlParams', options)
	return options;
}
getUrlParams('asfsaf.com?id=asdsf&name=bozai');

// 数组混淆
// 随机更改数组元素顺序，混淆数组
const arrMix = (arr) => {
	return arr.slice().sort(()=> Math.random() - 0.5)
}
console.log(arrMix([1,2,3,4,5,6,7]))

/*for(let i = 0; ++i < 101; console.log( i % 5 ? f||i : f+'Buzz')) {
	f=i%3?'':'Fizz'
}*/

var a = {
	value: 0,
	valueOf: function() {
		this.value++;
		return this.value;
	}
}
console.log(a == 1 && a == 2) // true
